#!/bin/bash

# -----------------------------
# UniApp 构建自动化 Shell 脚本
# 作者: [你的名字]
# 版本: 1.3
# 说明:
#  - 该脚本自动安装依赖并编译 UniApp 项目到指定平台。
#  - 自动检测 `yarn` 是否安装，未安装时使用 `npm` 进行安装。
#  - 统一配置 `npm` 和 `yarn` 的包管理源，并设置 `node-sass` 源。
# -----------------------------

# 设定默认值
PLATFORMS=("h5" "mp-weixin")   # 支持的平台列表
PACKAGE_MANAGER="yarn"         # 默认使用 yarn
BUILD_MODE="build"             # 构建模式（可扩展为 dev）
WATCH_MODE=""                  # 是否开启 watch 监听模式
REGISTRY_URL="https://registry.npmjs.org/"  # 统一的 npm/yarn 源地址
NODE_SASS_MIRROR="https://registry.npmmirror.com/"  # node-sass 依赖源
NPM_PATH="$(which npm)"        # 获取 npm 执行路径
YARN_PATH="$(which yarn)"      # 获取 yarn 执行路径

# -----------------------------
# 显示帮助信息
# -----------------------------
show_help() {
    echo "使用方式: $0 [-p 平台] [-m 包管理工具] [-w] [-r 源地址]"
    echo "  -p  指定编译平台，例如 h5、mp-weixin"
    echo "  -m  选择包管理工具（npm 或 yarn），默认为 yarn"
    echo "  -w  启用 watch 监听模式"
    echo "  -r  指定 npm/yarn/node-sass 统一源地址"
    echo "示例: $0 -p h5 -m npm -w -r https://registry.npmmirror.com/"
    exit 0
}

# -----------------------------
# 解析命令行参数
# -----------------------------
while getopts "p:m:wr:h" opt; do
    case "${opt}" in
        p) TARGET_PLATFORM=${OPTARG} ;; # 目标平台
        m) PACKAGE_MANAGER=${OPTARG} ;; # 选择 npm 或 yarn
        w) WATCH_MODE="--watch" ;;      # 启用 watch 模式
        r) # 设置统一源
            REGISTRY_URL=${OPTARG}
            NODE_SASS_MIRROR=${OPTARG}
            ;;
        h) show_help ;; # 显示帮助信息
        *) show_help ;; # 处理错误参数
    esac
done

# -----------------------------
# 参数校验
# -----------------------------
if [[ -z "$TARGET_PLATFORM" ]]; then
    echo "❌ 错误：请使用 -p 指定编译平台"
    show_help
fi

if [[ ! " ${PLATFORMS[@]} " =~ " ${TARGET_PLATFORM} " ]]; then
    echo "❌ 错误：不支持的平台 '${TARGET_PLATFORM}'"
    echo "支持的平台: ${PLATFORMS[*]}"
    exit 1
fi

# -----------------------------
# 检查并安装 Yarn（如果未安装）
# -----------------------------
if [[ "$PACKAGE_MANAGER" == "yarn" && -z "$YARN_PATH" ]]; then
    echo "⚠️ 检测到 yarn 未安装，正在使用 npm 进行安装..."
    npm install -g yarn
    export PATH="$(npm root -g)/yarn/bin:$PATH"
    YARN_PATH="$(which yarn)"

    if [[ -z "$YARN_PATH" ]]; then
        echo "❌ 错误：yarn 安装失败，请手动安装后重试"
        exit 1
    fi
    echo "✅ Yarn 安装成功！"
fi

# -----------------------------
# 配置 npm 和 yarn 源
# -----------------------------
echo "📌 统一配置 npm/yarn 及 node-sass 依赖源..."

if [[ "$PACKAGE_MANAGER" == "npm" ]]; then
    npm config set registry "$REGISTRY_URL"
elif [[ "$PACKAGE_MANAGER" == "yarn" ]]; then
    yarn config set registry "$REGISTRY_URL"
else
    echo "❌ 错误：不支持的包管理工具 '$PACKAGE_MANAGER'，请使用 npm 或 yarn"
    exit 1
fi

# 配置 node-sass 依赖镜像
export SASS_BINARY_SITE="$NODE_SASS_MIRROR"

# -----------------------------
# 强制安装依赖
# -----------------------------
echo "📦 开始安装依赖..."
if [[ "$PACKAGE_MANAGER" == "npm" ]]; then
    npm install --force
else
    yarn install --force
fi
echo "✅ 依赖安装完成！"

# -----------------------------
# 生成并执行构建命令
# -----------------------------
CMD="$PACKAGE_MANAGER run $BUILD_MODE:$TARGET_PLATFORM $WATCH_MODE"

# 输出执行信息
echo "🚀 执行编译命令: $CMD"
echo "📌 使用包管理工具: $PACKAGE_MANAGER"
echo "🔗 统一使用源: $REGISTRY_URL"
echo "🛠 设定 node-sass 镜像源: $NODE_SASS_MIRROR"

# 执行构建
eval $CMD

# 检查构建结果
if [[ $? -ne 0 ]]; then
    echo "❌ 构建失败，请检查错误日志！"
    exit 1
else
    echo "✅ 构建成功！"
fi
